home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / C / Applications / Portable Patmos / usr / include / sys / disklabel.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-08  |  12.6 KB  |  393 lines  |  [TEXT/R*ch]

  1. /*
  2.  * Copyright (c) 1987, 1988 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  *    from: @(#)disklabel.h    7.19 (Berkeley) 5/7/91
  34.  *    $Id: disklabel.h,v 1.9 1993/12/07 03:25:12 briggs Exp $
  35.  */
  36.  
  37. #ifndef _SYS_DISKLABEL_H_
  38. #define _SYS_DISKLABEL_H_
  39.  
  40. /*
  41.  * Disk description table, see disktab(5)
  42.  */
  43.  
  44. #define    _PATH_DISKTAB    "/etc/disktab"
  45. #define    DISKTAB        "/etc/disktab"        /* deprecated */
  46.  
  47. /*
  48.  * Each disk has a label which includes information about the hardware
  49.  * disk geometry, filesystem partitions, and drive specific information.
  50.  * The label is in block 0 or 1, possibly offset from the beginning
  51.  * to leave room for a bootstrap, etc.
  52.  */
  53.  
  54. /* XXX these should be defined per controller (or drive) elsewhere, not here! */
  55. #ifdef i386
  56. #define LABELSECTOR    1            /* sector containing label */
  57. #define LABELOFFSET    0            /* offset of label in sector */
  58. #endif
  59.  
  60. #ifndef    LABELSECTOR
  61. #define LABELSECTOR    0            /* sector containing label */
  62. #endif
  63.  
  64. #ifndef    LABELOFFSET
  65. #define LABELOFFSET    64            /* offset of label in sector */
  66. #endif
  67.  
  68. #define DISKMAGIC    ((u_long) 0x82564557)    /* The disk magic number */
  69. #ifndef MAXPARTITIONS
  70. #define    MAXPARTITIONS    8
  71. #endif
  72.  
  73.  
  74. #ifndef LOCORE
  75. struct disklabel {
  76.     u_long    d_magic;        /* the magic number */
  77.     short    d_type;            /* drive type */
  78.     short    d_subtype;        /* controller/d_type specific */
  79.     char    d_typename[16];        /* type name, e.g. "eagle" */
  80.     /* 
  81.      * d_packname contains the pack identifier and is returned when
  82.      * the disklabel is read off the disk or in-core copy.
  83.      * d_boot0 and d_boot1 are the (optional) names of the
  84.      * primary (block 0) and secondary (block 1-15) bootstraps
  85.      * as found in /usr/mdec.  These are returned when using
  86.      * getdiskbyname(3) to retrieve the values from /etc/disktab.
  87.      */
  88. #if defined(KERNEL) || defined(STANDALONE)
  89.     char    d_packname[16];            /* pack identifier */ 
  90. #else
  91.     union {
  92.         char    un_d_packname[16];    /* pack identifier */ 
  93.         struct {
  94.             char *un_d_boot0;    /* primary bootstrap name */
  95.             char *un_d_boot1;    /* secondary bootstrap name */
  96.         } un_b; 
  97.     } d_un; 
  98. #define d_packname    d_un.un_d_packname
  99. #define d_boot0        d_un.un_b.un_d_boot0
  100. #define d_boot1        d_un.un_b.un_d_boot1
  101. #endif    /* ! KERNEL or STANDALONE */
  102.             /* disk geometry: */
  103.     u_long    d_secsize;        /* # of bytes per sector */
  104.     u_long    d_nsectors;        /* # of data sectors per track */
  105.     u_long    d_ntracks;        /* # of tracks per cylinder */
  106.     u_long    d_ncylinders;        /* # of data cylinders per unit */
  107.     u_long    d_secpercyl;        /* # of data sectors per cylinder */
  108.     u_long    d_secperunit;        /* # of data sectors per unit */
  109.     /*
  110.      * Spares (bad sector replacements) below
  111.      * are not counted in d_nsectors or d_secpercyl.
  112.      * Spare sectors are assumed to be physical sectors
  113.      * which occupy space at the end of each track and/or cylinder.
  114.      */
  115.     u_short    d_sparespertrack;    /* # of spare sectors per track */
  116.     u_short    d_sparespercyl;        /* # of spare sectors per cylinder */
  117.     /*
  118.      * Alternate cylinders include maintenance, replacement,
  119.      * configuration description areas, etc.
  120.      */
  121.     u_long    d_acylinders;        /* # of alt. cylinders per unit */
  122.  
  123.             /* hardware characteristics: */
  124.     /*
  125.      * d_interleave, d_trackskew and d_cylskew describe perturbations
  126.      * in the media format used to compensate for a slow controller.
  127.      * Interleave is physical sector interleave, set up by the formatter
  128.      * or controller when formatting.  When interleaving is in use,
  129.      * logically adjacent sectors are not physically contiguous,
  130.      * but instead are separated by some number of sectors.
  131.      * It is specified as the ratio of physical sectors traversed
  132.      * per logical sector.  Thus an interleave of 1:1 implies contiguous
  133.      * layout, while 2:1 implies that logical sector 0 is separated
  134.      * by one sector from logical sector 1.
  135.      * d_trackskew is the offset of sector 0 on track N
  136.      * relative to sector 0 on track N-1 on the same cylinder.
  137.      * Finally, d_cylskew is the offset of sector 0 on cylinder N
  138.      * relative to sector 0 on cylinder N-1.
  139.      */
  140.     u_short    d_rpm;            /* rotational speed */
  141.     u_short    d_interleave;        /* hardware sector interleave */
  142.     u_short    d_trackskew;        /* sector 0 skew, per track */
  143.     u_short    d_cylskew;        /* sector 0 skew, per cylinder */
  144.     u_long    d_headswitch;        /* head switch time, usec */
  145.     u_long    d_trkseek;        /* track-to-track seek, usec */
  146.     u_long    d_flags;        /* generic flags */
  147. #define NDDATA 5
  148.     u_long    d_drivedata[NDDATA];    /* drive-type specific information */
  149. #define NSPARE 5
  150.     u_long    d_spare[NSPARE];    /* reserved for future use */
  151.     u_long    d_magic2;        /* the magic number (again) */
  152.     u_short    d_checksum;        /* xor of data incl. partitions */
  153.  
  154.             /* filesystem and partition information: */
  155.     u_short    d_npartitions;        /* number of partitions in following */
  156.     u_long    d_bbsize;        /* size of boot area at sn0, bytes */
  157.     u_long    d_sbsize;        /* max size of fs superblock, bytes */
  158.     struct    partition {        /* the partition table */
  159.         u_long    p_size;        /* number of sectors in partition */
  160.         u_long    p_offset;    /* starting sector */
  161.         u_long    p_fsize;    /* filesystem basic fragment size */
  162.         u_char    p_fstype;    /* filesystem type, see below */
  163.         u_char    p_frag;        /* filesystem fragments per block */
  164.         u_short    p_cpg;        /* filesystem cylinders per group */
  165.     } d_partitions[MAXPARTITIONS];    /* actually may be more */
  166. };
  167. #else /* LOCORE */
  168.     /*
  169.      * offsets for asm boot files.
  170.      */
  171.     .set    d_secsize,40
  172.     .set    d_nsectors,44
  173.     .set    d_ntracks,48
  174.     .set    d_ncylinders,52
  175.     .set    d_secpercyl,56
  176.     .set    d_secperunit,60
  177.     .set    d_end_,276        /* size of disk label */
  178. #endif /* LOCORE */
  179.  
  180. /* d_type values: */
  181. #define    DTYPE_SMD        1        /* SMD, XSMD; VAX hp/up */
  182. #define    DTYPE_MSCP        2        /* MSCP */
  183. #define    DTYPE_DEC        3        /* other DEC (rk, rl) */
  184. #define    DTYPE_SCSI        4        /* SCSI */
  185. #define    DTYPE_ESDI        5        /* ESDI interface */
  186. #define    DTYPE_ST506        6        /* ST506 etc. */
  187. #define    DTYPE_FLOPPY        10        /* floppy */
  188.  
  189. /* d_subtype values: */
  190. #define DSTYPE_INDOSPART    0x8        /* is inside dos partition */
  191. #define  DSTYPE_DOSPART(s)     ((s) & 3)     /* dos partition number */
  192. #define DSTYPE_GEOMETRY        0x10        /* drive params in label */
  193.  
  194. #ifdef DKTYPENAMES
  195. static char *dktypenames[] = {
  196.     "unknown",
  197.     "SMD",
  198.     "MSCP",
  199.     "old DEC",
  200.     "SCSI",
  201.     "ESDI",
  202.     "ST506",
  203.     "type 7",
  204.     "type 8",
  205.     "type 9",
  206.     "floppy",
  207.     0
  208. };
  209. #define DKMAXTYPES    (sizeof(dktypenames) / sizeof(dktypenames[0]) - 1)
  210. #endif
  211.  
  212. /*
  213.  * Filesystem type and version.
  214.  * Used to interpret other filesystem-specific
  215.  * per-partition information.
  216.  */
  217. #define    FS_UNUSED    0        /* unused */
  218. #define    FS_SWAP        1        /* swap */
  219. #define    FS_V6        2        /* Sixth Edition */
  220. #define    FS_V7        3        /* Seventh Edition */
  221. #define    FS_SYSV        4        /* System V */
  222. #define    FS_V71K        5        /* V7 with 1K blocks (4.1, 2.9) */
  223. #define    FS_V8        6        /* Eighth Edition, 4K blocks */
  224. #define    FS_BSDFFS    7        /* 4.2BSD fast file system */
  225. #define    FS_MSDOS    8        /* MSDOS file system */
  226.  
  227. #ifdef    DKTYPENAMES
  228. static char *fstypenames[] = {
  229.     "unused",
  230.     "swap",
  231.     "Version 6",
  232.     "Version 7",
  233.     "System V",
  234.     "4.1BSD",
  235.     "Eighth Edition",
  236.     "4.2BSD",
  237.     "MSDOS",
  238.     0
  239. };
  240. #define FSMAXTYPES    (sizeof(fstypenames) / sizeof(fstypenames[0]) - 1)
  241. #endif
  242.  
  243. /*
  244.  * flags shared by various drives:
  245.  */
  246. #define        D_REMOVABLE    0x01        /* removable media */
  247. #define        D_ECC        0x02        /* supports ECC */
  248. #define        D_BADSECT    0x04        /* supports bad sector forw. */
  249. #define        D_RAMDISK    0x08        /* disk emulator */
  250. #define        D_CHAIN        0x10        /* can do back-back transfers */
  251. #define        D_DOSPART    0x20        /* within MSDOS partition */
  252.  
  253. /*
  254.  * Drive data for SMD.
  255.  */
  256. #define    d_smdflags    d_drivedata[0]
  257. #define        D_SSE        0x1        /* supports skip sectoring */
  258. #define    d_mindist    d_drivedata[1]
  259. #define    d_maxdist    d_drivedata[2]
  260. #define    d_sdist        d_drivedata[3]
  261.  
  262. /*
  263.  * Drive data for ST506.
  264.  */
  265. #define d_precompcyl    d_drivedata[0]
  266. #define d_gap3        d_drivedata[1]        /* used only when formatting */
  267.  
  268. /*
  269.  * Drive data for SCSI.
  270.  */
  271. #define    d_blind        d_drivedata[0]
  272.  
  273. #ifndef LOCORE
  274. /*
  275.  * Structure used to perform a format
  276.  * or other raw operation, returning data
  277.  * and/or register values.
  278.  * Register identification and format
  279.  * are device- and driver-dependent.
  280.  */
  281. struct format_op {
  282.     char    *df_buf;
  283.     int    df_count;        /* value-result */
  284.     daddr_t    df_startblk;
  285.     int    df_reg[8];        /* result */
  286. };
  287.  
  288. /*
  289.  * Structure used internally to retrieve
  290.  * information about a partition on a disk.
  291.  */
  292. struct partinfo {
  293.     struct disklabel *disklab;
  294.     struct partition *part;
  295. };
  296.  
  297. #ifdef i386
  298. /* DOS partition table -- located in boot block */
  299.  
  300. #define    DOSBBSECTOR    0    /* DOS boot block relative sector number */
  301. #define    DOSPARTOFF    446
  302. #define NDOSPART    4
  303.  
  304. struct dos_partition {
  305.     unsigned char    dp_flag;    /* bootstrap flags */
  306.     unsigned char    dp_shd;        /* starting head */
  307.     unsigned char    dp_ssect;    /* starting sector */
  308.     unsigned char    dp_scyl;    /* starting cylinder */
  309.     unsigned char    dp_typ;        /* partition type */
  310. #define        DOSPTYP_386BSD    0xa5        /* 386BSD partition type */
  311.     unsigned char    dp_ehd;        /* end head */
  312.     unsigned char    dp_esect;    /* end sector */
  313.     unsigned char    dp_ecyl;    /* end cylinder */
  314.     unsigned long    dp_start;    /* absolute starting sector number */
  315.     unsigned long    dp_size;    /* partition size in sectors */
  316. } dos_partitions[NDOSPART];
  317.  
  318. #include <sys/dkbad.h>
  319. struct cpu_disklabel {
  320.     struct dos_partition dosparts[NDOSPART];
  321.     struct dkbad bad;
  322. };
  323.  
  324. #endif /* i386 */
  325.  
  326. #if defined(hp300) || defined(mac68k) || defined(vax) || defined(pc532) || \
  327.     defined(sun3)
  328. struct cpu_disklabel {
  329. };
  330. #endif
  331.  
  332. #define    DPSECT(s) ((s) & 0x3f)        /* isolate relevant bits of sector */
  333. #define    DPCYL(c, s) ((c) + (((s) & 0xc0)<<2)) /* and those that are cylinder */
  334.  
  335. /*
  336.  * Disk-specific ioctls.
  337.  */
  338.         /* get and set disklabel; DIOCGPART used internally */
  339. #define DIOCGDINFO    _IOR('d', 101, struct disklabel)/* get */
  340. #define DIOCSDINFO    _IOW('d', 102, struct disklabel)/* set */
  341. #define DIOCWDINFO    _IOW('d', 103, struct disklabel)/* set, update disk */
  342. #define DIOCGPART    _IOW('d', 104, struct partinfo)    /* get partition */
  343.  
  344. /* do format operation, read or write */
  345. #define DIOCRFORMAT    _IOWR('d', 105, struct format_op)
  346. #define DIOCWFORMAT    _IOWR('d', 106, struct format_op)
  347.  
  348. #define DIOCSSTEP    _IOW('d', 107, int)    /* set step rate */
  349. #define DIOCSRETRIES    _IOW('d', 108, int)    /* set # of retries */
  350. #define DIOCWLABEL    _IOW('d', 109, int)    /* write en/disable label */
  351.  
  352. #define DIOCSBAD    _IOW('d', 110, struct dkbad)    /* set kernel dkbad */
  353.  
  354. #if defined(KERNEL)
  355.  
  356. #ifdef i386
  357. int bounds_check_with_label __P((struct buf *, struct disklabel *, int));
  358. #endif
  359.  
  360. void diskerr __P((struct buf *, char *, char *, int, int, struct disklabel *));
  361. void disksort __P((struct buf *, struct buf *));
  362. int dkcksum __P((struct disklabel *));
  363.  
  364. int setdisklabel __P((struct disklabel *, struct disklabel *, u_long,
  365.     struct cpu_disklabel *));
  366. int cpu_setdisklabel __P((struct disklabel *, struct disklabel *, u_long,
  367.     struct cpu_disklabel *));
  368.  
  369. char *readdisklabel __P((int, int (*)(), struct disklabel *,
  370.     struct cpu_disklabel *));
  371. char *cpu_readdisklabel __P((int, int (*)(), struct disklabel *,
  372.     struct cpu_disklabel *));
  373.  
  374. int writedisklabel __P((int, int (*)(), struct disklabel *,
  375.     struct cpu_disklabel *));
  376. int cpu_writedisklabel __P((int, int (*)(), struct disklabel *,
  377.     struct cpu_disklabel *));
  378.  
  379. #endif
  380. #endif /* LOCORE */
  381.  
  382. #if !defined(KERNEL) && !defined(LOCORE)
  383.  
  384. #include <sys/cdefs.h>
  385.  
  386. __BEGIN_DECLS
  387. struct disklabel *getdiskbyname __P((const char *));
  388. __END_DECLS
  389.  
  390. #endif
  391.  
  392. #endif /* !_SYS_DISKLABEL_H_ */
  393.